D26_ALG101-Unit 5 + Unit 6


Posted by Christy on 2021-05-14

LIOJ 1033:最近點對

  • 解題想法:這一題是平面距離的延伸,題目要求的是要求哪兩個座標距離最近,也就是最小值的意思,看到這裡我應該要聯想到之前做過的撲克牌,要設一個變數為 Infinity

  • 首先要把所有的數都取出來,n 要記得轉成數字;座標要取 lines 的每一行,每個座標用空格分割,把這些值當成一個物件放進陣列裡面

  • 這題我要多做幾次。

const { format } = require('path');
var readline = require('readline');

var lines = []
var rl = readline.createInterface({
  input: process.stdin
});

rl.on('line', function (line) {
  lines.push(line)
});

rl.on('close', function() {
  solve(lines)
})

function solve(lines) {
 let n = Number(lines[0])
 //接下來取得資料的方式很不熟悉
 let dots = []//把所有座標放進去
 for(let i=1; i<lines.length; i++) {
     let temp = lines[i].split(' ')
     dots.push({//座標當成一個物件傳進去
         x: Number(temp[0]),
         y: Number(temp[1])
     })
 }

 let min = Infinity
 let ans = null
 for(let i=0; i<dots.length; i++){
     for(let j=i+1; j<dots.length; j++) {
        let dis = distance(
            dots[i].x, dots[i].y, dots[j].x, dots[j].y
        )
        if(dis < min) {
            min = dis
            ans = {
                x1: dots[i].x,
                y1: dots[i].y,
                x2: dots[j].x,
                y2: dots[j].y
            }
        }
     }
 }
 //這裡是題目要求的輸出方式
 if (ans.x1 > ans.x2) {
    console.log(ans.x2 + ' ' + ans.y2)
    console.log(ans.x1 + ' ' + ans.y1)
 } else if (ans.x1 < ans.x2) {
    console.log(ans.x1 + ' ' + ans.y1)
    console.log(ans.x2 + ' ' + ans.y2)
 } else {
    if (ans.y1 > ans.y2) {
     console.log(ans.x2 + ' ' + ans.y2)
     console.log(ans.x1 + ' ' + ans.y1)
    } else {
     console.log(ans.x1 + ' ' + ans.y1)
     console.log(ans.x2 + ' ' + ans.y2)
    }
 }
}
//這個是計算距離的公式
function distance(x1, y1, x2, y2) {
    let result = Math.sqrt(
            Math.abs(x1 - x2) * Math.abs(x1 - x2) + 
            Math.abs(y1 - y2) * Math.abs(y1 - y2)
    )   
    return result
}

Unit6:內建函式做做看

  • map: 是一個內建函式,可以用來轉換陣列;map 會把陣列裡面所有的元素傳進你指定的函式,再輸出一個新的陣列
function map(arr, callback) {//傳進一個陣列跟函式
    let result = []
    for (let i = 0; i < arr.length; i++) {
      result[i] = callback(arr[i])
    }
    return result
  }

  console.log(map([1, 2, 3], double))

參考資料:
Day13【ES6 小筆記】Array.map() - 處理陣列最佳選擇

箭頭函式:Day04【ES6 小筆記】箭頭函式 - 基礎使用範例(Arrow function )

  • String.repeat: 'abc'.repeat(3) // abcabcabc
function repeat(str, t) {
 let result = ''
 for(i=1; i<=t; i++) {
     result += str
 }
 return result
}

console.log(repeat('abc', 2)) //abcabc
  • Array.lastIndexOf:

indexOf 介紹

console.log([1, 2, 3, 1].indexOf(4))
//這裡會回傳 -1,表示沒有 ‘4‘ 這個值

console.log([1, 2, 3, 1].indexOf(2))
//回傳 ‘1’,表示數字 2 在陣列的第 1 個元素

console.log([1, 2, 3, 1].indexOf(1))
//回傳 ‘0’,表示數字 1 在陣列的第 0 個元素
//只會找第一個出現的數字

lastIndexOf:在陣列由後往前尋找裡面尋找某個元素

console.log([1, 2, 3, 1].lastIndexOf(1))
//回傳 ‘3’,表示數字在陣列的第 3 個元素

console.log([1, 2, 3, 1].lastIndexOf(3))
//還是一樣回傳 ‘2’,表示數字在陣列的第 2 個元素
//實作 lastIndexOf 函式
function lastIndexOf(arr, target) {
    for(i=arr.length - 1; i>=0; i--) {
        if(arr[i] === target) {
            return i
        }
    }
    return -1
}

console.log(lastIndexOf([1, 3, 5, 3], 3))

Project6 LIOJ 1036:Array reverse

Make an imitation of Array reverse function

  • I found the hard part is taking care output
var readline = require('readline');

var lines = []
var rl = readline.createInterface({
  input: process.stdin
});

rl.on('line', function (line) {
  lines.push(line)
});

rl.on('close', function() {
  solve(lines)
})

function solve(lines) {
    let numbers = []
    for(let i=1; i<lines.length; i++) {
        numbers.push(lines[i])
    }
    let arr = reverse(numbers)
    for(let i=0; i<arr.length; i++) {
        console.log(arr[i])
    }
}

// LIOJ 1036:Array reverse
function reverse(arr) {
    let result = []
    for(let i=arr.length - 1; i>=0; i--) {
        result.push(arr[i])
        //這行不可以寫成 result += arr[i],OJ wrong answer
    }
    return result
}

LIOJ 1037:Array filter

Make an imitation of Array filter function

// 這題 callback 會是一個 function,但難度會比較高
// 若是做不出來,也可以調整參數

  • 我的解法,因為做不出來 callback 這個 function,覺得函式傳來傳去有點不習慣
var readline = require('readline');

var lines = []
var rl = readline.createInterface({
  input: process.stdin
});

rl.on('line', function (line) {
  lines.push(line)
});

rl.on('close', function() {
  solve(lines)
})

function solve(lines) {
    let target = lines[0]
    let arr = []
    for(let i=2; i<lines.length; i++) {
        arr.push(lines[i])
    }
    let result = filter(arr)
    for(let i=0; i<result.length; i++) {
        console.log(result[i])
    }
}

function filter(arr) {
    let ans = []
    for(let i=0; i<arr.length; i++) {
        if(arr[i] !== lines[0]) {
            ans.push(arr[i])
        }
    }
    return ans
}
  • 正解
var readline = require('readline');

var lines = []
var rl = readline.createInterface({
  input: process.stdin
});

rl.on('line', function (line) {
  lines.push(line)
});

rl.on('close', function() {
  solve(lines)
})

function solve(lines) {
    let target = Number(lines[0])
    let arr = []
    for(let i=2; i<lines.length; i++) {
        arr.push(Number(lines[i]))
    }
    let newArr = filter(arr, function(element){
        return element !== target
    })
    for(let i=0; i<newArr.length; i++) {
        console.log(newArr[i])
    }
}

function filter(arr, callback) {
    let result = []
    for(let i=0; i<arr.length; i++) {
        if(callback(arr[i])) {
            result.push(arr[i])
        }
    }
    return result
}

LIOJ 1038:Array indexOf

  • Make an imitation of Array indexOf function
var readline = require('readline');

var lines = []
var rl = readline.createInterface({
  input: process.stdin
});

rl.on('line', function (line) {
  lines.push(line)
});

rl.on('close', function() {
  solve(lines)
})

function solve(lines) {
    let target = Number(lines[0])
    let arr= []
    for(let i=2; i<lines.length; i++) {
        arr.push(Number(lines[i]))
    }
    console.log(indexOf(arr, target))
}

// LIOJ 1038:Array indexOf
function indexOf(arr, searchElement) {
    for(let i=0; i<arr.length; i++) {
        if(arr[i] === searchElement) {
            return i
        } 
    }
    return -1
}

LIOJ 1039:Array fill

  • Make an imitation of Array fill function
var readline = require('readline');

var lines = []
var rl = readline.createInterface({
  input: process.stdin
});

rl.on('line', function (line) {
  lines.push(line)
});

rl.on('close', function() {
  solve(lines)
})

function solve(lines) {
    let target = Number(lines[0])
    let arr = []
    for(let i=2; i<lines.length; i++) {
        arr.push(Number(lines[i]))
    }
    let result = fill(arr, target)
    for(let i=0; i<result.length; i++) {
        console.log(result[i])
    }
}

// LIOJ 1039:Array fill
function fill(arr, value) {
    let ans = []
    for(let i=0; i<arr.length; i++) {
        ans[i] = value
    }
    return ans
}

LIOJ 1040:Array join

  • 這題雖然以前做過了,但做到最後還是有點卡卡的
var readline = require('readline');

var lines = []
var rl = readline.createInterface({
  input: process.stdin
});

rl.on('line', function (line) {
  lines.push(line)
});

rl.on('close', function() {
  solve(lines)
})

function solve(lines) {
    let str = lines[0]
    let arr = []
    for(let i=2; i<lines.length; i++) {
        arr.push(lines[i])
    }
    console.log(join(arr, str))
}

// LIOJ 1040:Array join
function join(arr, separator) {
    let result = ''
    for(let i=0; i<arr.length; i++) {
        if(i === arr.length - 1) {
            result += arr[i]
        } else {
            result += arr[i] + separator
        }
    }
    return result
}

//另外一個比較簡單的邏輯是,把 1 以及 !2!3 分開來看
//天吶,有夠聰明的想法!
function join(arr, separator) {
    let result = arr[0]
    for(let i=1; i<arr.length; i++) {
        result += separator + arr[i]
    }
    return result
}









Related Posts

619. Biggest Single Number

619. Biggest Single Number

NoSQL, Transaction, ACID and Lock

NoSQL, Transaction, ACID and Lock

「Node.js」利用 .env 與環境變數隱藏敏感資料 by dotenv

「Node.js」利用 .env 與環境變數隱藏敏感資料 by dotenv


Comments